/**
 * 双指针
 * 80、删除有序数组中的重复项II
 */
public class Exerciser3 {
    /**
     * 这个是通用解法
     * 26.删除有序数组中的重复项 也可以这样做
     * @param nums
     * @return
     */
    public int removeDuplicates(int[] nums) {
        // 使每个元素出现两次 相当于是 保留最多 2 位
        // 1.那么数组当中的前k个数字，是一定保存的
        // 2.对于后面的数字，能保存的话需要满足：与当前的写入的位置前面的第 k个元素进行比较，不同则需要与当前写入位置的值进行替换，并继续往后走
        // 比如： [1,1,1,1,2,2,3,3,3]，k=2
        // 从头往后遍历数据，因为是有序的
        // 1.设置变量index，表示待插入位置的下标(同样也是需要返回的长度)，初始化为0，数组为[]
        // 2.前2个数字，直接保存，index为2，[1,1]
        // 3.继续往后遍历，能够保存的话需要满足与index位置前面第2个元素不同，
        //   那么相当于是直接跳过1数字，将第一个2放到index位置之后index++，[1,1,2]
        // 4.继续这个流程，将2放入到数组中，之后index++，数组为[1,1,2,2]
        // 5.继续这个过程，将前2个3放入到数组中index++，数组为[1,1,2,2,3,3]
        // 6.遍历结束之后index 就为这个数组的长度
        return remove(nums,2);
    }

    public int remove(int[] nums,int k) {
        int index = 0;
        for(int num : nums) {
            if(index < k || nums[index - k] != num) {
                nums[index++] = num;
            }
        }
        return index;
    }
}
